package cn.song.logread.controller;


import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.song.logread.config.TokenManager;
import cn.song.logread.config.WebMvcConfig;
import cn.song.logread.util.IpUtil;
import cn.song.logread.util.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 登录控制器
 *
 * @author SongRenShuo
 * @date 2025/03/16
 */
@Slf4j
@RestController
@RequestMapping("/sys")
public class LoginController {

    /** 用户列表 */
    @Value("${userList}")
    private String userList;
    /** IP 白名单 - 支持通配符 **/
    @Value("${ipWhitelistList}")
    private String ipWhitelistList;

    /**
     * 用户登录认证接口
     *
     * @param userName 用户名（必须非空）
     * @param passWord 密码（必须非空）
     * @param request HTTP请求对象，用于会话管理
     * @return 包含token的响应对象，结构为：
     *         {
     *             code: 状态码（200成功）,
     *             msg: 提示信息,
     *             data: {
     *                 token: 认证令牌
     *             }
     *         }
     * @throws RuntimeException 当用户不存在或密码错误时抛出异常
     * @date 2025/03/16
     * @author SongRenShuo
     */
    @PostMapping("/login")
    public R<Map<String, Object>> login(String userName, String passWord, HttpServletRequest request) {
        // 参数有效性校验
        if (StrUtil.isBlank(userName)) {
            return R.failed("用户名不能为空");
        }
        if (StrUtil.isBlank(passWord)) {
            return R.failed("密码不能为空");
        }
        if (StrUtil.isBlank(userList)) {
            return R.failed("系统账号未配置，请联系管理员");
        }

        // 从配置的用户列表中匹配用户信息
        JSONObject userJson = JSONUtil.parseArray(userList).stream().filter(item -> {
                    JSONObject jsonObject = (JSONObject) item;
                    return StrUtil.equals(jsonObject.getStr("userName"), userName);
                }).map(item -> (JSONObject) item)
                .findFirst().orElseThrow(() -> new RuntimeException("账户不存在：" + userName));

        if (!userJson.getStr("passWord").equals(passWord)) {
            return R.failed("密码错误");
        }

        String ip = IpUtil.getIpAddr(request);
        Assert.isTrue(WebMvcConfig.ipWhitelistVerify(ip,ipWhitelistList), "请求IP不可信：" + ip);

        // 生成带用户名前缀的UUID令牌（去除横杠并转大写）
        String token = userName + "_" + UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        Map<String, Object> jwt = new HashMap<>();
        jwt.put("userName", userName);
        jwt.put("token", token);
        jwt.put("updatedTime", System.currentTimeMillis());
        TokenManager tokenManager = TokenManager.getInstance();
        tokenManager.removeTokenAllByUserName(userName);
        tokenManager.addToken(token, jwt);

        Map<String, Object> hashMap = new HashMap<>();
        hashMap.put("token", token);
        return R.success(hashMap);
    }


}
